defer 陷阱
defer和函数返回值
defer中如果引用了函数的返回值,则因引用形式不同会导致不同的结果。
下面来看三个示例:
1 |
|
想想看最终会输出什么呢?
实际的执行结果如下,是不是和预想的有差异呢?
1 | === RUN TestDefer |
首先来看看f1()
内部的执行顺序
1 | func f1() (r int) { // 1. 要执行f1 初始化返回值r为零值 相当于 var r int = 0 |
再看f2()
的执行过程
1 | func f2() (r int) { // 初始化返回值r为零值 相当于 var r int = 0 ,此时r=0 |
最后看下f3()
的执行过程
1 | func f3() (r int) { // 初始化返回值r为零值 相当于 var r int = 0 ,此时r=0 |